// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动！任何基于本项目二次开发而产生的一切法律纠纷和责任，我们不承担任何责任！


using Admin.NET.Application;

namespace Admin.NET.Core.Service;

/// <summary>
/// 系统文件服务 🧩
/// </summary>
[ApiDescriptionSettings(Order = 410)]
public class SysFileExService : IDynamicApiController, ITransient
{
    private readonly UserManager _userManager;
    private readonly SqlSugarRepository<SysFolder> _sysFolderRep;
    private readonly SqlSugarRepository<SysFile> _sysFileRep;

    public SysFileExService(UserManager userManager, SqlSugarRepository<SysFolder> sysFolderRep, SqlSugarRepository<SysFile> sysFileRep)
    {
        _userManager = userManager;
        _sysFolderRep = sysFolderRep;
        _sysFileRep = sysFileRep;
    }

    /// <summary>
    /// 获取文件分页列表 🔖
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [DisplayName("获取文件分页列表")]
    public async Task<SqlSugarPagedList<FileExOutput>> Page(PageFolderInput input)
    {
        var lst = await _sysFileRep.AsQueryable()
                       .Where(folder => folder.BelongId == input.FolderId)
                       .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.FileName.Contains(input.Name.Trim()))
                       .OrderBy(folder => folder.CreateTime, OrderByType.Desc)
                       .Select(file => new FileExOutput
                       {
                           Type = "File",
                           Id = file.Id,
                           Name = file.FileName,
                           Ext = file.Suffix,
                           Url = file.Url,
                           Size = file.SizeKb,
                           CreateTime = file.CreateTime
                       }, true)
                       .ToPagedListAsync(input.Page, input.PageSize);
        //如果是第一页，加载子目录
        if (input.Page == 1)
        {
            var lstFolder = await _sysFolderRep.AsQueryable()
                                  .Where(folder => folder.Pid == input.FolderId)
                                  .Select((folder) => new FileExOutput
                                  {
                                      Type = "Folder",
                                      Id = folder.Id,
                                      Name = folder.Name,
                                      CreateTime = folder.CreateTime
                                  })
                                  .ToListAsync();
            lst.Items = lstFolder.Concat(lst.Items);
        }
        //
        return lst;
    }

    /// <summary>
    /// 新建文件夹
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [DisplayName("新建文件夹")]
    public async Task<SysFolder> CreateFolder([FromForm] FolderInput input)
    {
        return await _sysFolderRep.AsInsertable(input.Adapt<SysFolder>()).ExecuteReturnEntityAsync();
    }

}